package exception

import (
	"errors"
	"fmt"
)

/*
	panic 是一个内建函数，用于在遇到严重的运行时错误时触发异常。当调用 panic 时，程序的执行会被立即中断，并开始回溯调用栈，直到遇到 recover 或程序终止。
	panic 可以带一个参数，这个参数通常会被打印出来，以便于调试。
*/

type Exception interface {
	m_panic()
	m_error(x int, y int) (int, error)
}

// 定义一个结构体
type goException struct {
}

func (g goException) m_panic() {
	defer fmt.Println("-------------------- panic end ----------------------")
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered from panic:", r)
		}
	}()
	for i := 0; i < 10; i++ {
		if float64(i)/2 == float64(0) {
			panic("i is not be 0!")
		}
	}
	fmt.Println("我大弟刘备天下无敌!")
	fmt.Println("我二弟关羽天下无敌!")
	fmt.Println("我三弟张飞天下无敌!")
}

func (g goException) m_error(x int, y int) (int, error) {
	defer fmt.Println("-------------------- error end ----------------------")
	var divZeroError = errors.New("The divisor y cannot be 0!")
	var divZeroFmt = fmt.Errorf("The divisor y cannot be 0!")
	if y == 0 {
		fmt.Println(divZeroError)
		fmt.Println(divZeroFmt)
		return 0, divZeroError
	}
	return x / y, nil
}

// 接口的执行
func Exceptioninterface(Ex Exception) {
	Ex.m_panic()
	Ex.m_error(1, 0)
}

// 主方法执行
func ExceptionRun() {
	var E Exception
	// 实例化一个
	gEx := goException{}
	E = gEx
	Exceptioninterface(E)
}
